package qc.module.platform.service;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.module.platform.entity.QcRoleMenu;
import qc.module.platform.repository.QcRoleMenusRepository;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class RoleMenuService {

    private QcRoleMenusRepository repository;

    @Autowired
    public void setRepository(QcRoleMenusRepository repository) {
        this.repository = repository;
    }

    /**
     * 判断关联关系是否存在
     *
     * @param roleId 角色ID
     * @param menuId 菜单ID
     * @return boolean
     * @author QuCheng Tech
     * @since 2023/9/2
     */
    public boolean hasExist(int roleId, int menuId) {
        LambdaQueryWrapper<QcRoleMenu> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(QcRoleMenu::getRoleid, roleId);
        wrapper.eq(QcRoleMenu::getMenuid, menuId);

        QcRoleMenu en = repository.selectOne(wrapper);
        if (en != null)
            return true;

        return false;
    }

    /**
     * 根据菜单id删除菜单与角色的关联关系
     *
     * @param menuId 菜单id
     * @author QcCheng Tech
     * @since 2023/7/3
     */
    public void deleteByMenuId(int menuId) {
        LambdaQueryWrapper<QcRoleMenu> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(QcRoleMenu::getMenuid, menuId);
        repository.delete(wrapper);
    }

    /**
     * 根据角色id删除角色与菜单的关联关系
     *
     * @param id 角色id
     */
    public void deleteByRoleId(int id) {
        LambdaUpdateWrapper<QcRoleMenu> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(QcRoleMenu::getRoleid, id);
        repository.delete(wrapper);
    }

    /**
     * 添加角色菜单关联关系
     *
     * @param roleId 角色id
     * @param menuId 菜单ID
     */
    public void add(int roleId, int menuId) {
        //判断角色用户是否已经关联如果已经关联则不添加
        if (!hasExist(roleId, menuId)) {
            QcRoleMenu qcRoleMenu = new QcRoleMenu();
            qcRoleMenu.setRoleid(roleId);
            qcRoleMenu.setMenuid(menuId);
            repository.insert(qcRoleMenu);
        }
    }

    /**
     * 根据菜单id集合删除菜单与角色的关联关系
     *
     * @param menuIds 菜单id
     * @author QcCheng Tech
     * @since 2023/7/3
     */
    public void deleteByMenuIds(List<Integer> menuIds) {
        LambdaQueryWrapper<QcRoleMenu> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(QcRoleMenu::getMenuid, menuIds);
        repository.delete(wrapper);
    }

    /**
     * 根据角色id集合批量删除角色与菜单的关联关系
     *
     * @param roleIds 角色id集合
     */
    public void deleteByRoleIds(List<Integer> roleIds) {
        LambdaUpdateWrapper<QcRoleMenu> wrapper = new LambdaUpdateWrapper<>();
        wrapper.in(QcRoleMenu::getRoleid, roleIds);
        repository.delete(wrapper);
    }

    /**
     * 根据指定角色id和菜单id删除角色与菜单的关联关系
     * @param roleId 角色id
     * @param menuId 菜单id
     */
    public void deleteByRoleIdAndMenuId(Integer roleId,Integer menuId){
        LambdaQueryWrapper<QcRoleMenu> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(QcRoleMenu::getRoleid,roleId);
        wrapper.eq(QcRoleMenu::getMenuid,menuId);
        repository.delete(wrapper);
    }

    /***
     * 根据指定的角色ID获取菜单ID集合
     *
     * @param roleId 角色ID
     * @return java.util.List<java.lang.Integer>
     * @author QuCheng Tech
     * @since 2023/8/31
     */
    public List<Integer> getMenuIds(int roleId) {
        LambdaQueryWrapper<QcRoleMenu> wrapper = new LambdaQueryWrapper<>();
        wrapper.select(QcRoleMenu::getMenuid);
        wrapper.eq(QcRoleMenu::getRoleid, roleId);
        //查询数据
        List<QcRoleMenu> ens = repository.selectList(wrapper);
        if (ens != null && ens.size() > 0x0) {
            return ens.stream().map(QcRoleMenu::getMenuid).collect(Collectors.toList());
        }

        return null;
    }

    /**
     * 根据指定的菜单ID获取角色id集合
     * 
     * @param menuId 菜单ID
     * @return List<Integer> 角色id集合
     * @author QuCheng Tech
     * @since 2024/1/4
     */
    public List<Integer> getRoleIds(Integer menuId){
        LambdaQueryWrapper<QcRoleMenu> wrapper = new LambdaQueryWrapper<>();
        wrapper.select(QcRoleMenu::getRoleid);
        wrapper.eq(QcRoleMenu::getMenuid,menuId);
        List<QcRoleMenu> ens = repository.selectList(wrapper);
        if (CollectionUtils.isNotEmpty(ens)) {
            return ens.stream().map(QcRoleMenu::getRoleid).collect(Collectors.toList());
        }
        return null;
    }

    /***
     * 根据指定的角色ID集合获取菜单ID集合
     *
     * @param roleIds 角色ID集合
     * @return java.util.List<java.lang.Integer>
     * @author QuCheng Tech
     * @since 2023/8/30
     */
    public List<Integer> getByRoleIds(List<Integer> roleIds) {
        if (roleIds != null && roleIds.size() > 0x0) {
            LambdaQueryWrapper<QcRoleMenu> wrapper = new LambdaQueryWrapper<>();
            wrapper.select(QcRoleMenu::getMenuid);
            wrapper.in(QcRoleMenu::getRoleid, roleIds);
            //查询数据
            List<QcRoleMenu> ens = repository.selectList(wrapper);
            if (ens != null && ens.size() > 0x0) {
                return ens.stream().map(QcRoleMenu::getMenuid).collect(Collectors.toList());
            }
        }

        return null;
    }
}
